package thread;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: wx
 * Date: 2023-12-07
 * Time: 0:20
 */
//让 thread 内置一个上述的变量
//{
// .

//   }
public class ThreadDemo12 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
                                          //只是将上一个代码中判定 isQuit 改成判定intrrupted()
            while(!Thread.currentThread().isInterrupted()){
                  //Thread.currentThread()指 获取当前变量,那个线程调用,就得到那个线程的实例(类似于this)
                                           //isInterrupted()相当于这个线程里边包含了一个变量,通过它来判断当前变量是否结束
                System.out.println("我是一个线程,正在工作中...");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    break;
                }
            }
            System.out.println("线程执行完毕!");
        });
        t.start();

        Thread.sleep(3000);
        //使用 intrrupt() 这个方法来修改刚才的标志位
        //如果没有 sleep,interrupt可以让线程顺利结束.有 sleep 会引起变数,也就是异常;
        // 在执行sleep的过程中,调用interrupt
        // sleep休眠时间还没到,就被提前唤醒了
        // 这时候,会做两件事
        // 1) 抛出interruptException(紧接着会被 catch获取到)
        // 2) 清除 Thread 对象的 isInterrupt 标志位.
        // 但是通过interrupt方法,已经变数标志位设为 true
        // 但是 sleep 提前唤醒操作,就把标志位又设回 false
        // 要想循环结束,只需要在 catch中加入break.
        System.out.println("让 t 线程结束");
        t.interrupt();//相当于使用 Thread 内部自带的标志位,来代替刚才手动创建的 isQuit 变量了
    }
}
